#ifndef __OSCILLOSCOPE_H
#define __OSCILLOSCOPE_H
#include "sys.h"

#define ADC_REF_Volt  2.048f//ADC�ο���ѹ
#define ADC_SAMPLE_RATE  10.0f*1000*1000//ADC������ 		STM32H7 12bit TIADC 10MSPS  36M����
#define ADC_SAMPLE_TIME 100 // ADC�������� 100nS
#define ADC_bit   12  //ADC����λ��
#define ADC_LSB (ADC_REF_Volt/(0x0001<<ADC_bit))
#define ADC_STORE_DEEPTH 1024*63//�洢���2*50Kpts
#define ADC_DATA_TO_DISPLAY_K ((float)(PIXEL_NUM_PER_DIV*8)/((float)(0x01<<ADC_bit)-1)) // ADC�������ֵ��������Ļ���ش�ֱ������귶Χ��480��

#define WAVE_WINDOW_WIDTH 890 //������ʾ���������ʾ�ĵ���
#define OV_Line_Y   260//0V��λ��
#define PIXEL_NUM_PER_DIV 60


#define MAX_MEASURE_TYPE_NUM  5 //�ܹ�����������Ŀ

typedef struct 
{
	/*��λ����*/
	uint32_t Vertical_Gear;//��ֱ��ѹ��λ Ĭ��200mV��λ
	uint32_t Horizontal_Gear ;//ˮƽʱ����λ Ĭ��5uS��λ
	u8 VG_cnt;
	u8 HG_cnt;
	int32_t Horizontal_offset;//ˮƽƫ��
	int32_t Vertical_offset;//��ֱƫ��
	/*��������*/
	uint16_t ADC_Trigger_Th;//������ֵ��Ĭ��ΪADC�������ֵ��һ��
	int16_t touch_TrigLine_pos;//��Ļ�ϴ����ߵ�λ�ã�Ĭ��Ϊ����260
	u16 Wave_Start_point;//������
	u8 Trigger_Type;//��������   
	u8 Trigger_Mode;//����ģʽ
	/*��ʾ����*/
	u8 ADC_DATA_OK;//ADC���ݴ������
	u8 display_Start_flag;
	u8 Inter_Mode;//����Ĭ��ģʽ�����ߣ�
	u8 Coup_Mode;//Ĭ��DCֱ�����
	u8 DPX_Mode;//����ӫ����ά��ʾ���ƣ�Ĭ��0��OFF��	
}Contronl_TypeDef;
typedef struct
{
	/********ʾ��������*********/
	uint8_t Measure_Type[MAX_MEASURE_TYPE_NUM] ;//�����������ֵ�Ĳ������� 
	float Wave_Vpp;//���η��ֵ
	float Wave_Cycle;//��������
	float Wave_Freq;//����Ƶ��
	float Positive_width;//������
	float Negetive_width;//������
	float wire_length;//���³���
	float wire_Z;//�����迹

	/****�м����*****/
	u16 period_wave_point_num;//���ڵ���
	u8 period_wave_max;//����
	u8 period_wave_min;//��С��
	u8 period_wave_center;//�м��
	u16 wave_pos_point_num;//������
	u16 wave_neg_point_num;//������
}Measure_TypeDef;
typedef struct
{
	Contronl_TypeDef ctrl;
	Measure_TypeDef meas;
}OSC_TypeDef;

/********ʾ����������**********/
extern uint16_t WaveWindow_Buf[1024];//����������ʾ������
extern u32 ADC_SampleData_Buf[ADC_STORE_DEEPTH];//ADC�������ݻ��� 10Kpts
extern u8 period_Wave_data[1024];
/********ʾ����***************/
extern OSC_TypeDef my_OSC;
 
u16 find_Period_Wave(u16 *data,u16 data_num,u16 Trigger_threshold);
u16 find_Pos_point(u8 *period_wave,u16 point_num,u8 center);//����һ�����ڲ����е�������
u32 find_WaveStart(u16 *data,u32 data_num,int32_t Trigger_threshold,u8 Trigger_Type);
u16 find_reflectTime(u8 *data,u16 data_num);
float find_reflectVoltK(u8 *data,u16 data_num);

void OSC_init(void);
void Osc_Draw_Interface(void);
void Osc_Show_0VLine(void);
void Osc_Show_TrigLine(void);
void Osc_Show_Grid(void);
void Osc_Show_Waveform(u16 * data_buf,u16 start_X,u16 start_Y,u8 size,u32 color);
void Osc_Measure_display(void);
void Osc_Data_display(void);
void Osc_Circuit_Control(void);
void Osc_Wave_Measure(void);
void Osc_CMD_Control(void );
#endif  
	 
